package model.courtier;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;

import org.hibernate.Query;

import model.donnee.Client;
import model.singleton.HibernateUtil;
import model.singleton.SingletonClient;

public class DAOClient {

	public DAOClient() { }

	/****
	 * getClient : Cette méthode permet de récupérer les informations du client avec
	 * 		le id du client.
	 * 
	 * @param idClient Le numéro du client.
	 * @return L'objet contenant les informations du client.
	 */
	public static Client getClient(int idClient) {
		// La requête envoyée à Hibernate.
		String query =  "SELECT c.* FROM Client c WHERE c.idClient = " + idClient;

		// Récupère les données de la base de données à l'aide d'Hibernate.
		@SuppressWarnings("unchecked")
		ArrayList<Client> clients = (ArrayList<Client>) HibernateUtil.requete(
				query, Client.class);

		return clients.get(0);
	}
	
	/****
	 * getClient : Cette méthode permet de récupérer un client à l'aide des informations du login.
	 * 
	 * @param nomUsager Le nom de l'usagé (Adresse email)
	 * @param motDePasse Le mot de passe de l'usagé.
	 * @return Les données du client.
	 */
	public static Client getClient(String nomUsager, String motDePasse){		
		// La requête envoyée à Hibernate.
		String sQuery = "SELECT c.* FROM Client c,Login l WHERE c.email = :nomUsager AND c.idUsager = l.idUsager AND UPPER(l.mpencrypt) = UPPER('"+getMD5(motDePasse)+"')";
		
		Query query = HibernateUtil.getSession().createSQLQuery(sQuery)
				.addEntity(Client.class)
				.setParameter("nomUsager", nomUsager);
		
		// Récupère les données de la base de données à l'aide d'Hibernate.
		@SuppressWarnings("unchecked")
		ArrayList<Client> c = (ArrayList<Client>) query.list();
		// Définit la session actuelle du client.
		if(!c.isEmpty()){
			SingletonClient.setInstance(c.get(0));
			return SingletonClient.getInstance();
		}	
		return null;
	}
	
	public static String getMD5(String motDePasse){
		String motDePasseEncrypte = null;
		try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(motDePasse.getBytes());
            
            BigInteger number = new BigInteger(1, messageDigest);
            motDePasseEncrypte = number.toString(16);
            
            while (motDePasseEncrypte.length() < 32) {
                motDePasseEncrypte = "0" + motDePasseEncrypte;
            }
        }
        catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
		return motDePasseEncrypte;
	}
	
}
